iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
自我挑戰組

用數據守護雙眼:生活型態對視力影響的探索性資料分析系列 第 8 篇

邁向雙變數探索!螢幕時長與眼部症狀的散佈圖與趨勢擬合

  • 分享至 

  • xImage
  •  

透過Seaborn的regplot繪製散佈圖並疊加線性迴歸擬合線,同時利用抖動與透明度解決離散量表點位重疊問題。

一、實作前情境:離散量表繪製散佈圖的「重疊盲點」
在探討兩個連續型變數(或一個連續型、一個離散評分)的關聯時,散佈圖是最直觀的工具。
然而,本專案的Eye_Dryness_Level與Eye_Pain_Level皆為0到10的整數評分(Discrete Integer Scale)。如果直接使用常規的 sns.scatterplot(),許多具有相同螢幕時長與評分的樣本點會完全重疊在一起,導致視覺上無法判斷某個點位究竟代表 1 位受試者還是 20 位受試者(即所謂的 Overplotting 問題)。

為了解決這個視覺盲點,本日實作採用兩種處理手法:

  1. 設置透明度 (alpha=0.4):藉由顏色深淺直觀反映樣本重疊密度。
  2. 加入微量抖動 (x_jitter / y_jitter):在sns.regplot中對評分座標施加微小隨機擾動,使重疊點散開,呈現真實樣本濃度。
  3. 疊加擬合線 (line_kws):繪製最小平方法(OLS)趨勢線與95%信賴區間陰影,初步判定斜率方向。

二、撰寫雙變數關聯視覺化腳本
在Notebook中新增程式碼儲存格,使用plt.subplots建立1列2行的對比畫布:

# ==========================================
# Day 8:雙變數關聯分析(散佈圖 + 迴歸趨勢線)
# ==========================================

import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

# 引用中文字型
font_path = 'NotoSansTC-Regular.otf'
my_font = fm.FontProperties(fname=font_path)

# 1.建立 1x2 畫布佈局
fig, axes = plt.subplots(1, 2, figsize=(16, 6))
sns.set_theme(style="whitegrid")

# --- 圖1:螢幕使用時數 vs 眼睛乾澀程度 ---
sns.regplot(
    data=df,
    x='Daily_Screen_Hours',
    y='Eye_Dryness_Level',
    ax=axes[0],
    color='#2b5c8f',
    scatter_kws={'alpha': 0.4, 's': 35},
    line_kws={'color': '#d9534f', 'linewidth': 2},
    y_jitter=0.25 # 對離散評分施加輕微垂直抖動以避免重疊
)
axes[0].set_title('每日螢幕使用時數 vs 眼睛乾澀程度', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[0].set_xlabel('每日螢幕使用時數(小時/天)', fontproperties=my_font, fontsize=12)
axes[0].set_ylabel('乾澀自評分數 (0-10 分)', fontproperties=my_font, fontsize=12)
axes[0].set_ylim(-0.8, 10.8)

# --- 圖2:螢幕使用時數 vs 眼痛程度 ---
sns.regplot(
    data=df,
    x='Daily_Screen_Hours',
    y='Eye_Pain_Level',
    ax=axes[1],
    color='#31708f',
    scatter_kws={'alpha': 0.4, 's': 35},
    line_kws={'color': '#d9534f', 'linewidth': 2},
    y_jitter=0.25
)
axes[1].set_title('每日螢幕使用時數 vs 眼痛程度', fontproperties=my_font, fontsize=14, fontweight='bold')
axes[1].set_xlabel('每日螢幕使用時數(小時/天)', fontproperties=my_font, fontsize=12)
axes[1].set_ylabel('眼痛自評分數 (0-10 分)', fontproperties=my_font, fontsize=12)
axes[1].set_ylim(-0.8, 10.8)

plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20260922/20178794CYHOR5Ye2L.png

三、圖表解讀與數據洞察(打破直覺的意外發現)
觀察由regplot繪製出的兩張散佈圖與趨勢擬合結果:
1.趨勢線走勢:斜率近乎為零(無明顯單純線性關聯)

  • 左圖(螢幕時數 vs.乾澀):紅色迴歸線維持在約4.7分的位置,走勢近乎水平,僅帶有微不可察的極微弱正斜率。
  • 右圖(螢幕時數 vs.眼痛):迴歸線精準橫切在5.0分的中位線上,斜率幾乎為0,且95%信賴區間帶相當平緩。
  • 實質意涵:直覺上常認為「用眼越久,眼睛必然越痛越乾」,但數據分佈打破了這個單一因果假設。這證實了眼部疲勞並非由單一「時長」獨立決定的單變量問題。

2.點位分佈格局:全面散佈與高度異質性

  • 點位均勻散佈於整個二維平面上。即使在每日使用僅2~4小時的低暴露區間,仍有受試者評出9~10分的高不適感;反之,在每日使用高達12~14小時的極端重度區間,依然存在評分為0~2分的族群。
  • 這項發現凸顯了「生活調節變數」的重要性——為什麼有些人長時間用眼卻不易眼痛?關鍵可能在於我們尚未納入交叉比對的變數,例如每小時休息頻率(Break_Frequency_Per_Hour)、藍光防護習慣(Blue_Light_Filter_Used)或每日睡眠長度(Sleep_Hours)。

3.實作工程反思

  • 透過引入y_jitter輕微垂直擾動與alpha=0.4半透明設定,成功解決了0~10分離散量表點位全部疊死在同一水平線上的繪圖限制,清晰呈現了真實樣本在各座標區間的均勻濃度。

這項觀察為接下來的分析提供了絕佳的故事轉折點:單看兩個變數看不出線性趨勢,因此更需要計算全欄位相關係數矩陣來找出背後真正具有影響力的隱藏因子!


上一篇
症狀量表深度透視!箱形圖與小提琴圖實作
下一篇
量化關聯性!全特徵皮爾森相關係數矩陣與熱力圖實作
系列文
用數據守護雙眼:生活型態對視力影響的探索性資料分析 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言